home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / ioblixdevkit / c / examples / testresource.c < prev   
C/C++ Source or Header  |  1999-05-14  |  7KB  |  194 lines

  1. /*
  2.     This program is meant to demonstrate how to work with ioblix.resource's
  3.     functions to obtain and release chips in exclusive and shared mode
  4. */
  5.  
  6. #include <exec/exec.h>
  7. #include <resources/ioblix.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10.  
  11. #include <proto/exec.h>
  12. #include <proto/ioblix.h>
  13.  
  14.  
  15. UBYTE __aligned myname[]="TestResource 37.2 "__AMIGADATE__;
  16. UBYTE __aligned version[]="$VER: TestResource 37.2 "__AMIGADATE__;
  17. UBYTE __aligned copyright[]="(C)opyright 1998,1999 by Thore Böckelmann and RBM Computertechnik. All rights reserved";
  18.  
  19. struct IOBlixResource *IOBlixBase = NULL;
  20.  
  21. void FindChipTest( void )
  22. {
  23.     struct IOBlixChipNode *cn;
  24.  
  25.     printf("FindChip() test\n");
  26.  
  27.     // simply try to find one chip and say wether it was found or not
  28.     if (cn = FindChip(ICT_Z2_SERIAL_CHIP, 0)) {
  29.         printf("UART #0 on Z2 board is available\n");
  30.     } else {
  31.         printf("UART #0 on Z2 board is not available\n");
  32.     }
  33.  
  34.     // this one can't exist
  35.     if (cn = FindChip(ICT_Z2_SERIAL_CHIP, 142)) {
  36.         printf("UART #142 on Z2 board is available\n");
  37.     } else {
  38.         printf("UART #142 on Z2 board is not available\n");
  39.     }
  40.     printf("\n");
  41. }
  42.  
  43. void ObtainChipTest( void )
  44. {
  45.     struct IOBlixChipNode *cn1, *cn2;
  46.     UBYTE *oldOwner1 = NULL, *oldOwner2 = NULL;
  47.  
  48.     printf("ObtainChip() test\n");
  49.  
  50.     // try to obtain one chip two times in exclusive mode
  51.     // the first try should succeed, but the second must fail
  52.     if (cn1 = ObtainChip(ICT_Z2_SERIAL_CHIP, 0, "TestResource", &oldOwner1)) {
  53.         printf("locked UART #0 1st time\n");
  54.         if (cn2 = ObtainChip(ICT_Z2_SERIAL_CHIP, 0, "TestResource", &oldOwner2)) {
  55.             printf("locked UART #0 2nd time, this can't happen\n");
  56.             ReleaseChip(cn2);
  57.         } else {
  58.             printf("failed to lock UART #0 a 2nd time");
  59.             if (oldOwner2) {
  60.                 printf(", already locked by \"%s\"\n", oldOwner2);
  61.             } else {
  62.                 printf(", chip is not available??\n");
  63.             }
  64.         }
  65.         ReleaseChip(cn1);
  66.     } else {
  67.         printf("failed to lock UART #0 1st time");
  68.         if (oldOwner1) {
  69.             printf(", already locked by \"%s\"\n", oldOwner1);
  70.         } else {
  71.             printf(", chip is not available\n");
  72.         }
  73.     }
  74.     printf("\n");
  75. }
  76.  
  77. void ObtainChipSharedTest( void )
  78. {
  79.     struct IOBlixChipNode *cn, *cn2;
  80.     UBYTE newOwner[32];
  81.     UBYTE *oldOwner = NULL;
  82.     struct Node *user;
  83.     ULONG cnt;
  84.  
  85.     printf("ObtainChipShared() test\n");
  86.  
  87.     // try to obtain one chip several times in shared mode, print user list, release it again some times
  88.     for (cnt = 1; cnt <= 9; cnt++) {
  89.         sprintf(newOwner, "TestResource%02ld", cnt);
  90.         ObtainChipShared(ICT_Z2_SERIAL_CHIP, 0, newOwner, NULL);
  91.     }
  92.     sprintf(newOwner, "TestResource%02ld", cnt);
  93.     if (cn = ObtainChipShared(ICT_Z2_SERIAL_CHIP, 0, newOwner, &oldOwner)) {
  94.         printf("UART #0 has been locked %ld times\n", cn->icn_SharedAccessorCount);
  95.         printf("user list:\n");
  96.         for (user = cn->icn_SharedAccessorList.lh_Head; user->ln_Succ; user = user->ln_Succ) {
  97.             printf("\t%s\n", user->ln_Name);
  98.         }
  99.         printf("releasing chip for users \"TestResource03\" and \"TestResource07\"\n");
  100.         ReleaseChipShared(cn, "TestResource03");
  101.         ReleaseChipShared(cn, "TestResource07");
  102.         printf("UART #0 has been locked %ld times\n", cn->icn_SharedAccessorCount);
  103.         printf("user list:\n");
  104.         for (user = cn->icn_SharedAccessorList.lh_Head; user->ln_Succ; user = user->ln_Succ) {
  105.             printf("\t%s\n", user->ln_Name);
  106.         }
  107.         printf("trying to obtain chip in exclusive mode\n");
  108.         if (cn2 = ObtainChip(ICT_Z2_SERIAL_CHIP, 0, "TestResourceExcl", &oldOwner)) {
  109.             printf("this should never happen!\n");
  110.             ReleaseChip(cn2);
  111.         } else {
  112.             printf("exclusive lock failed");
  113.             if (oldOwner) {
  114.                 printf(", already locked by \"%s\"\n", oldOwner);
  115.             } else {
  116.                 printf(" chip is not available??\n");
  117.             }
  118.         }
  119.         printf("releasing all users\n");
  120.         for (cnt = 1; cnt <= 10; cnt++) {
  121.             sprintf(newOwner, "TestResource%02ld", cnt);
  122.             ReleaseChipShared(cn, newOwner);
  123.         }
  124.         printf("UART #0 has been locked %ld times\n", cn->icn_SharedAccessorCount);
  125.     } else {
  126.         printf("failed to lock UART #0");
  127.         if (oldOwner) {
  128.             printf(", already locked by \"%s\"\n", oldOwner);
  129.         } else {
  130.             printf(", chip is not available\n");
  131.         }
  132.     }
  133.     printf("\n");
  134. }
  135.  
  136. void AllocChipListTest( void )
  137. {
  138.     struct List *list;
  139.     struct IOBlixChipNode *node;
  140.     struct Node *user;
  141.     ULONG cnt;
  142.  
  143.     printf("AllocChipList() test\n");
  144.     if (list = AllocChipList()) {
  145.         for (node = (struct IOBlixChipNode *)list->lh_Head, cnt = 1; node->icn_Node.ln_Succ; node = (struct IOBlixChipNode *)node->icn_Node.ln_Succ, cnt++) {
  146.             printf("chip #%ld is a ", cnt);
  147.             switch(node->icn_Type) {
  148.                 case ICT_Z2_SERIAL_CHIP:
  149.                     printf("UART on a Z2 board\n");
  150.                     break;
  151.                 case ICT_Z2_PARALLEL_CHIP:
  152.                     printf("ParPort on a Z2 board\n");
  153.                     break;
  154.                 case ICT_Z2_EXTFIFO_CHIP:
  155.                     printf("external FIFO on a Z2 board\n");
  156.                     break;
  157.                 case ICT_CP_SERIAL_CHIP:
  158.                     printf("UART on a ClockPort module\n");
  159.                     break;
  160.                 case ICT_CP_PARALLEL_CHIP:
  161.                     printf("ParPort on a ClockPort module\n");
  162.                     break;
  163.                 default:
  164.                     printf("some other kind of chip\n");
  165.                     break;
  166.             }
  167.             printf("current user is \"%s\"\n", (node->icn_Owner) ? node->icn_Owner : (UBYTE *)"nobody");
  168.             if (node->icn_Flags & ICFF_SHARED) {
  169.                 printf("chip is locked in shared mode by %ld users\n", node->icn_SharedAccessorCount);
  170.                 printf("user list:\n");
  171.                 for (user = node->icn_SharedAccessorList.lh_Head; user->ln_Succ; user = user->ln_Succ) {
  172.                     printf("\t%s\n", user->ln_Name);
  173.                 }
  174.             }
  175.         }
  176.         FreeChipList(list);
  177.     }
  178.     printf("\n");
  179. }
  180.  
  181. void main(void)
  182. {
  183.     IOBlixBase = (struct IOBlixResource *)OpenResource(IOBLIXRESNAME);
  184.     if (IOBlixBase) {
  185.         FindChipTest();
  186.         ObtainChipTest();
  187.         ObtainChipSharedTest();
  188.         AllocChipListTest();
  189.     } else {
  190.         printf("Can't find ioblix.resource. Please run SetupIOBlix\n");
  191.     }
  192. }
  193.  
  194.